package cn.mesmile.thread;

/**
 * @author zb
 * @date 2020/12/27 22:49
 * @Description:
 */
public class ThreadRunnable {

    /**
     * 1.创建一个实现了Runable接口的类
     * 2.实现类去实现Runnable中的抽象方法：run()
     * 3.创建实现类的对象
     * 4.将此对象作为参数传递到Thread类中的构造器中，创建Thread类的对象
     * 5.通过Thread类的对象调用start（）
     *
     *  比较创建线程的两种方式：
     * 开发中，优先选择实现Runable接口的方式
     * 原因
     *   1：实现的方式没有类的单继承性的局限性
     *    2：实现的方式更适合用来处理多个线程有共享数据的情况
     */

    private static int ticket = 100;

    public static void main(String[] args) {

//        ExecutorService executorService = Executors.newFixedThreadPool(10);
//        ExecutorService executorService = Executors.newCachedThreadPool();

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                while (true) {
                    synchronized (ThreadRunnable.class){
                        if (ticket > 0) {
                            try {
                                Thread.sleep(10);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            // pool-1-thread-1
                            System.out.println(Thread.currentThread().getName() + "当前售出第" + ticket + "张票");
                            ticket--;
                        } else {
                            break;
                        }
                    }
                }
            }
        };

        //虽然有三个线程，但是只有一个窗口类实现的Runnable方法，由于三个线程共用一个window对象，所以自动共用100张票
        Thread t1 = new Thread(runnable);
        Thread t2 = new Thread(runnable);
        Thread t3 = new Thread(runnable);

        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");

        t1.start();
        t2.start();
        t3.start();
    }
}
